# 利用Python Selemium编写一个程序，该程序能够读取指定的学生成绩电子表格，然后自动地填充到教务系统网站的表单中
import json
import pandas as pd
import sys
from selenium import webdriver
from selenium.webdriver.chrome.webdriver import WebDriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

# 提前在教务管理系统中找到需要录入成绩的课程，以及课程的链接地址，并且准备好相应的成绩电子表格
# 成绩电子表格的格式为：学号,姓名,平时成绩,测验成绩,最终成绩
# 三个成绩分别对应系统的平时成绩、期末成绩和总评成绩
with open("config.json", "r", encoding="utf-8") as fp:
    fillups = json.load(fp)


def login(driver: WebDriver, username: str, password: str):
    # 打开教务系统网站
    driver.get('http://210.42.171.165/default2.aspx')

    # 模拟用户登录
    # 找到用户名和密码的输入框，并模拟用户输入
    username_input = driver.find_element(
        by=By.XPATH, value='//*[@id="TextBox1"]')
    password_input = driver.find_element(
        by=By.XPATH, value='//*[@id="TextBox2"]')
    username_input.send_keys(username)
    password_input.send_keys(password)

    # 提示手动登录教务系统
    input('请手动登录教务系统网站，登录成功后请按任意键继续...')


def fill_scores(driver: WebDriver, fillup_password: str, scores_file: str, link: str):
    # 切换打开新窗口
    driver.get(link)
    print("打开成绩录入页面")
    # 找到密码输入框，并模拟用户输入
    input_box = driver.find_element(
        by=By.XPATH, value='/html/body/form/div/div/div[2]/table/tbody/tr[3]/td/input')
    input_box.send_keys(fillup_password)

    # 找到提交按钮，并模拟用户点击
    submit_button = driver.find_element(
        by=By.XPATH, value='/html/body/form/div/div/div[2]/table/tbody/tr[4]/td/input[1]')
    submit_button.click()
    print("开始填充成绩...")
    # 等待页面加载完成
    driver.implicitly_wait(10)
    # 将弹窗的两个提示框都关闭
    driver.switch_to.alert.accept()
    driver.switch_to.alert.accept()

    input("请手动输入成绩，完成后按任意键继续...")

    # 读取学生成绩电子表格
    # 读取Excel文件
    df = pd.read_excel(scores_file)

    # 遍历每一行数据，填充到表单中
    for index, row in df.iterrows():
        rowNum = index + 2
        given_name = row["姓名"]
        given_no = row["学号"]
        ps = row["平时成绩"]
        qm = row["测验成绩"]
        zp = row["最终成绩"]
        # 如果 ps 是nan，则设置成""
        if pd.isna(ps):
            ps = ""
        # 如果 qm 是nan，则设置成""
        if pd.isna(qm):
            qm = ""
        # 如果 zp 是nan，则设置成""
        if pd.isna(zp):
            zp = ""
        print("填充第", index+1, "行成绩...", row["姓名"], ps, qm, zp)
        try:
            # 平时成绩
            ps_score = driver.find_element(
                by=By.ID, value=f'DataGrid1__ctl{rowNum}_ps')
            # 找到包含当前成绩输入框的整行(tr)元素
            score_row = ps_score.find_element(
                by=By.XPATH, value='ancestor::tr')

            # 获取该行中的所有单元格(td)
            cells = score_row.find_elements(by=By.TAG_NAME, value='td')

            # 获取学号和姓名（假设它们分别在第2和第3个单元格）
            xh = cells[1].text  # 学号
            xm = cells[2].text  # 姓名

            print(f"正在处理: 学号={xh}, 姓名={xm}")
            if xh != given_no or xm != given_name:
                print(
                    f"学号或姓名不匹配，跳过该行: 系统中的学号={xh}, 姓名={xm}，电子表格中的姓名={given_name}, 学号={given_no}")
                continue

            # 先清除已有内容再填充
            ps_score.clear()
            ps_score.send_keys(ps)
            # 期末成绩
            qm_score = driver.find_element(
                by=By.ID, value=f'DataGrid1__ctl{rowNum}_qm')
            qm_score.clear()
            qm_score.send_keys(qm)
            # 总评成绩
            zp_score = driver.find_element(
                by=By.ID, value=f'DataGrid1__ctl{rowNum}_zp')
            zp_score.clear()
            zp_score.send_keys(zp)
        except Exception as e:
            print('找不到表格元素，请检查网页结构是否正确。', e)

    print("成绩填充完成")


def main(username: str, password: str, fillup_password: str):
    # 设置浏览器驱动路径
    # 可以通过 https://googlechromelabs.github.io/chrome-for-testing/#stable 下载到合适的版本，并放入virtualenv的Scripts文件夹中

    # 创建浏览器对象
    driver = webdriver.Chrome()
    login(driver, username, password)
    # 等待登录成功后的页面加载完成
    driver.implicitly_wait(10)  # 等待10秒
    # 刷新页面，保证driver获取到当前最新页面内容
    driver.refresh()
    print("登录成功，页面刷新完成")

    # list_courses(driver)

    # input("请手动选择课程，完成后按任意键继续...")
    for course_info in fillups:
        fill_scores(driver, fillup_password=fillup_password,
                    scores_file=course_info["scores_file"], link=course_info['link'])

        print("完成填充，请在页面上保存后按任意键继续")
        input()

    # 关闭浏览器
    driver.quit()

    print("程序已退出")


if __name__ == '__main__':
    # 从命令行获取用户名、密码、填充密码
    if len(sys.argv) == 4:
        username = sys.argv[1]
        password = sys.argv[2]
        fillup_password = sys.argv[3]
    elif len(sys.argv) == 2:
        username, password, fillup_password = sys.argv[1].split()
    else:
        print("请输入用户名、密码、填充密码")
        sys.exit(1)
    main(username=username, password=password, fillup_password=fillup_password)
